package test.niuke;

import java.util.Arrays;

/**
 * 输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有的奇数位于数组的前半部分，
 * 所有的偶数位于位于数组的后半部分，并保证奇数和奇数，偶数和偶数之间的相对位置不变。
 *
 * (快排不适合此题,因为不稳定; 可以用插入排序和归并排序, 本解法为插入排序)
 */
public class ReOrderOddEvenArray {
    public void reOrderArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 != 0) {
                insertAfter(array, search(array, 0, i), i);
            }
        }
    }

    /**
     * 把fromIndex为的数据insert到toIndex位置, 然后原toIndex位置及后面的数据均往后推1位
     *
     * @param array
     * @param toIndex
     * @param fromIndex
     */
    private void insertAfter(int[] array, int toIndex, int fromIndex) {
        int data = array[fromIndex];
        for (int i = fromIndex; i > toIndex; i--) {
            array[i] = array[i - 1];
        }
        array[toIndex] = data;
    }

    /**
     * 返回左到右第一个偶数的index
     *
     * @param array
     * @param start
     * @param end
     * @return
     */
    private int search(int[] array, int start, int end) {
        int i;
        for (i = start; i < end; i++) {
            if (array[i] % 2 == 0) {
                return i;
            }
        }
        return i;
    }

    public static void main(String[] args) {
        ReOrderOddEvenArray a = new ReOrderOddEvenArray();
        int[] my = new int[]{1, 3, 5, 7, 2, 4, 6};
        a.reOrderArray(my);
        System.out.println(Arrays.toString(my));
    }


}
